// 条款50：了解new和delete的合理替换时机
// 核心概念
// 条款50讨论了何时以及为什么我们可能需要替换C++标准的内存分配函数（operator new和operator delete）。这是一个高级话题，涉及内存管理的定制化。

// 为什么要替换new和delete
// 有几种情况下，替换标准的new和delete是合理的：
// 1.检测使用错误：
//      检测内存泄漏
//      检测内存越界访问
//      检测重复释放内存
// 2.提高性能：
//      减少内存碎片
//      提高分配/释放速度
//      针对特定分配模式优化
// 3.收集使用统计信息：
//      了解内存使用模式
//      分析内存分配热点
//      监控内存使用峰值
// 4.增加分配灵活性：
//      实现内存池
//      实现共享内存
//      实现特定内存对齐要求

// 替换方式
// 替换new和delete有三种主要方式：
// 1. 全局替换
// 替换全局的operator new和operator delete：
// 替换全局operator new
void *operator new(std::size_t size) throw(std::bad_alloc)
{
    void *ptr = malloc(size);
    if (ptr == nullptr)
        throw std::bad_alloc();

    std::cout << "全局operator new: " << size << " 字节" << std::endl;
    return ptr;
}

// 替换全局operator delete
void operator delete(void *ptr) throw()
{ 
    std::cout << "全局operator delete" << std::endl;
    free(ptr);
}